package main

import (
	"fmt"
	"reflect"
)

type User struct {
	Id   int
	Name string
	Age  int
}

// 绑定方法
func (u User) Hello() {
	fmt.Println("Hello")
}

func Poni(i interface{}) {
	/*
		type: main.User
		字符串类型： User
		{1 zs 20}
		Id : int
		 val : 1
		Name : string
		 val : zs
		Age : int
		 val : 20
		=================方法====================
		Hello
		func(main.User)
	*/
	t := reflect.TypeOf(i)
	fmt.Println("type:", t)         // type: main.User
	fmt.Println("字符串类型：", t.Name()) // 字符串类型： User
	// 获取值
	v := reflect.ValueOf(i)
	fmt.Println(v) // {1 zs 20}
	// 可以获取所有属性
	// 获取结构体字段个数：t.NumField()
	for i := 0; i < t.NumField(); i++ {
		// 取每个字段
		f := t.Field(i)
		fmt.Printf("%s : %v\n", f.Name, f.Type)
		// 获取字段的值信息
		// Interface()：获取字段对应的值
		val := v.Field(i).Interface()
		fmt.Println(" val :", val)
	}
	fmt.Println("=================方法====================")
	for i := 0; i < t.NumMethod(); i++ {
		m := t.Method(i)
		fmt.Println(m.Name)
		fmt.Println(m.Type)
	}
}
func main() {
	u := User{1, "zs", 20}
	Poni(u)
}
